//
//  无重复字符的最长子串.swift
//  手撕代码
//
//  Created by xiaoZuDeMeng on 2024/1/14.
//

import Foundation

// https://leetcode.cn/problems/longest-substring-without-repeating-characters/description/

//3. 无重复字符的最长子串
//中等
//相关标签
//相关企业
//给定一个字符串 s ，请你找出其中不含有重复字符的 最长子串 的长度。
//
//
//
//示例 1:
//
//输入: s = "abcabcbb"
//输出: 3
//解释: 因为无重复字符的最长子串是 "abc"，所以其长度为 3。
//示例 2:
//
//输入: s = "bbbbb"
//输出: 1
//解释: 因为无重复字符的最长子串是 "b"，所以其长度为 1。
//示例 3:
//
//输入: s = "pwwkew"
//输出: 3
//解释: 因为无重复字符的最长子串是 "wke"，所以其长度为 3。
//     请注意，你的答案必须是 子串 的长度，"pwke" 是一个子序列，不是子串。
//
//
//提示：
//
//0 <= s.length <= 5 * 104
//s 由英文字母、数字、符号和空格组成

func lengthOfLongestSubstring(_ s: String) -> Int {
    var map: [Character: Int] = [:]
    var left = 0
    var ans = 0
    var i = 0
    for (index, c) in s.enumerated() {
        i = index
        if let cur = map[c] {
            ans = max(ans, index - left)
            left = max(left, cur + 1)
        }
        map[c] = index
        i += 1
    }
    return max(ans, i - left)
}
